(function( $, undefined ) {
/*
	\name ru Ниспадающее меню
	\description ru Ниспадающее меню с выбором из фиксированного списка
	\save true
*/
$.widget("ui.ajajform_select",$.ui.ajajform_widget, {
	options: {
		// \type cssclass
		cssclass: "afw-select",
		add_null: false,
		not_null: false,
		// \type text
		// \name Выбранное значение
		value: "",
		// \type html
		htmltemplate: '<div class="af-label"></div><div class="af-edit"><select/><div class="af-error"></div></div><div style="clear: both;"></div>',
		htmltemplate_disableable: '<div class="af-label"></div><div class="af-disable"></div><div class="af-edit"><select/><div class="af-error"></div></div><div style="clear: both;"></div>',
		// \type array
		// \name Массив возможных значений
		// \skip 1
		values: [],
		groupped: false,
		disabled: false,
		disableable: false,
		readonly: false
	},
	i18n: {
		en: {
			empty: "Field is empty"
		},
		ru: {
			empty: "Поле не заполнено"
		}
	},
	_create: function() {
		this.genericCreate();
		this.refreshLabel();
		this.refreshSelect();
		this.refreshValues();
		this.refreshValue();
		this.refreshChange();
		this.refreshDisabled();
		this.refreshReadonly();
	},
	refreshSelect: function() {
		var i=$("select",this.element);
		i.addClass("ui-corner-all af-edit");
		i.width(this.options.width);
		i.bind("focus",function(e) { $(this).addClass("ui-state-highlight"); });
		if (this.options.validate) {
			i.bind("blur",this,function(e) {
				$(this).removeClass("ui-state-highlight");
				e.data.validate();
			});
		} else {
			i.bind("blur",function(e) { $(this).removeClass("ui-state-highlight"); });
		}
	},
	refreshReadonly: function() {
		$("select",this.element).attr('disabled',this.options.readonly?true:false);
	},
	refreshChange: function() {
		var i=$("select",this.element);
		if (!this.options.change) {
			if (this.oldBind) {i.unbind("change",this.oldBind);this.oldBind=null;}
			return;
		}
		if (this.oldBind) i.unbind("change",this.oldBind);
		this.oldBind=this.options.change;
		i.bind("change",{tag:i},this.oldBind);
	},
	refreshValues: function() {
		var cache=[];
		var sel1=$("select",this.element);
		sel1.empty();
		var opt1=this.options.values;
		if (this.options.add_null) $("<option></option>").appendTo(sel1).prop("value","").text("");

		function nbsps(l)
		{
			if (l==0) return "";
			if (!cache[l]) {
				var tmp="";
				for (var j=0;j<l*3;j++) tmp+=String.fromCharCode(160);
				cache[l]=tmp;
			}
			return cache[l];
		}
		function add_options(opt,sel,baselevel)
		{
			for (var i=0;i<opt.length;i++) {
				var name=opt[i].name;
				var l=(opt[i].level||1)+baselevel-1;
				$("<option></option>").appendTo(sel).prop("value",opt[i].id==null?"":opt[i].id).text(nbsps(l)+name);
			}
		}
		function add_rec(arr,sel,level)
		{
			for (var i=0;i<arr.length;i++) {
				var grp=$("<optgroup></opgroup>").prop("label",nbsps(level)+arr[i].label).appendTo(sel);
				if (arr[i].optgroups) add_rec(arr[i].optgroups,grp,level+1);
				if (arr[i].options) add_options(arr[i].options,grp,level);
			}

		}
		if (this.options.groupped) {
			add_rec(opt1,sel1,0);
		} else {
			add_options(opt1,sel1,0);
		}
	},
	refreshValue: function() {
		var v=this.options.value;
		var sel=$("select",this.element)[0];
		var opt=sel.options;
		for (var i=0;i<opt.length;i++) {
			if (opt[i].value==v) sel.selectedIndex=i;
		}
	},
	refreshDisabled: function() {
		$("select",this.element).attr("disabled",this.options.disabled?true:false);
		this.genericRefreshDisabled();
	},
	destroy: function() {
	},
	validate: function() {
		if (this.options.disabled) return false;
		var vd=this.options.validate;
		var inp=$("select",this.element);
//		if (!vd) return false;
		var r;
		if (this.options.not_null) {
			if (inp.val()=="") r=this.gettext("empty");
		}
		if (!r && vd) r=vd(inp.prop("selectedIndex"),this.options.values);
		if (r) inp.addClass("ui-state-error"); else inp.removeClass("ui-state-error");
		this.refreshError(r);
		return r?true:false;
	},
	postvalue: function(r) {
		if (this.options.disabled) return;
		var sel=$("select",this.element)[0];
		var ind=sel.selectedIndex;
		var optlist=sel.options;
		if (optlist.length<=ind) return;
		if (ind==-1) return;
		r[this.options.name]=optlist[ind].value;
	}
});

})( jQuery );
